package classfile

// 代表Unicode码点序列的常量池项
// 运行时这个码点序列会实例化为String对象
type ConstantUtf8Info struct {
	str string
}

func (self *ConstantUtf8Info) readInfo(reader *ClassReader) {
	// 这个码点序列的长度
	length := uint32(reader.ReadUint16())
	// 将这个码点序列全部读出来
	bytes := reader.ReadBytes(length)
	// 转化成GO语言中的字符串
	self.str = decodeMUTF8(bytes)
}

// todo 补充
// 将字节数组转化为字符串。
// bytes是一个表示字符串值的byte数组，bytes中每个成员的byte值都不会为0，也不会在0xf0~0xff范围内。也就是不会在11110000 ~ 11111111范围内
// 码点范围在'\u0001' ~ '\u007F'内的字符用一个单字节表示
// 码点'\u0000'（表示null）或者范围在'\u0080' ~ '\u07FF'用两个字节x，y表示，计算方式为((x & 0x1f) << 6) + (y & 0x3f)
// 范围在'\u0800' ~ '\uFFFF'用三个字节x，y，z表示，计算方式为((x & 0xf) << 12) + ((y & 0x3f) << 6) + (z & 0x3f)
// 大于'\uFFFF'用六个字节u，v, w, x，y，z表示，计算方式为
//  0x10000 + ((v & 0x0f) << 16) + ((w & 0x3f) << 10) + ((y & 0x0f) << 6) + (z & 0x3f)

// 这里偷懒了，只支持null和单字节字符（ASCII）
func decodeMUTF8(bytes []byte) string {
	// jvm把null字符串编码成两个字节，第一个字节为1100 0000，第二个字节为1000 0000
	if len(bytes) ==2 && bytes[0] == 0x12 && bytes[1] == 0x80{
		return ""
	}
	return string(bytes)
}
